package com.huangfu.learning.javabase.java.pattern.structure.bridge;

/**
 * Created with IntelliJ IDEA.
 * Author: huangfu.daohui
 * Date: 2018/8/13
 * Time: 19:30
 * Version: 1.0
 * Description: 桥接模式：用于把抽象化与实现化解耦，使得二者可以独立变化。这种模式涉及到一个作为桥接的接口，使得实体类的功能独立于接口实现类。这两种类型的类可被结构化改变而互不影响。
 * 参考：https://www.cnblogs.com/V1haoge/p/6497919.html
 * <p>
 * 优点： 1、抽象和实现的分离。 2、优秀的扩展能力。 3、实现细节对客户透明。
 * <p>
 * 缺点：桥接模式的引入会增加系统的理解与设计难度，由于聚合关联关系建立在抽象层，要求开发者针对抽象进行设计与编程。
 * <p>
 * 抽象（Abstraction ）角色：它定义了抽象类的接口而且维护着一个指向实现（Implementor）角色的引用。
 * 精确抽象（ RefinedAbstraction）角色：实现并扩充由抽象角色定义的接口。
 * 实现（ Implementor）角色：给出了实现类的接口，这里的接口与抽象角色中的接口可以不一致。
 * 具体实现（ ConcreteImplementor）角色：给出了实现角色定义接口的具体实现。
 * <p>
 * 实例准备：我们假设有一座桥，桥左边为A，桥右边为B，A有A1，A2，A3等，表示桥左边的三个不同地方，
 * B有B1，B2，B3等，表示桥右边的三个不同地方，假设我们要从桥左侧A出发到桥的右侧B，
 * 我们可以有多重方案，A1到B1，A1到B2，A1到B3，A2到B1...等等，以此为例
 **/
public class BridgePattern {
    public static void main(String[] args) {
        AreaA areaA = new AreaA1();
        areaA.qiao = new AreaB2();
        areaA.fromAreaA();
        areaA.qiao.targetAreaB();
    }
}

// 桥接口：Qiao
interface Qiao {
    // 目的地B
    void targetAreaB();
}

/**
 * 目的地B1,B2,B3
 */
// 目的地B1
class AreaB1 implements Qiao {
    @Override
    public void targetAreaB() {
        System.out.println("我要去B1");
    }
}

// 目的地B2
class AreaB2 implements Qiao {
    @Override
    public void targetAreaB() {
        System.out.println("我要去B2");
    }
}

// 目的地B3
class AreaB3 implements Qiao {
    @Override
    public void targetAreaB() {
        System.out.println("我要去B3");
    }
}

// 抽象来源地A：AreaA
abstract class AreaA {
    //引用桥接口
    Qiao qiao;

    //来源地
    abstract void fromAreaA();
}

/**
 * 来源地A1
 */
class AreaA1 extends AreaA {
    @Override
    void fromAreaA() {
        System.out.println("我来自A1");
    }
}

/**
 * 来源地A2
 */
class AreaA2 extends AreaA {
    @Override
    void fromAreaA() {
        System.out.println("我来自A2");
    }
}

/**
 * 来源地A3
 */
class AreaA3 extends AreaA {
    @Override
    void fromAreaA() {
        System.out.println("我来自A3");
    }
}

